<?php

class SiteSearch{
	public $bodyRegex = '';
	public $seen = array();

	public function searchDir($dir){
		// 包含匹配页面的数组
		$pages = array();

		// 包含要递归搜索的目录的数组
		$dirs = array();

		// 标志这个目录为已查看，保证不会再查看这个目录
		$this->seen[realpath($dir)] = true;

		try{
			foreach  (new RecursiveIteratorIterator(new RecursiveDdirectoryIterator($dir)) as $file){
				if ($file->isFile() && $file->isReadable() && (! isset($this->seen[$file->getPathname()]))) {
					// 标志为已查看
					// 如果再次遇到可以跳过
					$this->seen[$file->getPathname()] = true;

					// 将文件的内容加载到$text
					$text = file_get_contents($file->getPathname());

					// 如果搜索项在体定界符内部
					if (preg_match($this->bodyRegex,$text)) {

						// 构造文件的相对URI,
						// 从完整路径去除文档根
						$uri = substr_replace($file->getPathname, '', 0,strlen($_SERVER['DOCUMENT_ROOT']));

						// 如果页面有标题,找到这个标题
						if (preg_match('#<title>(.*?)</title>#Sis',$text,$match)) {

							// 并把标题和URI增加到$pages
							array_push($pages, array($uri,$match[1]));
						}else{

							// 否则使用URI作为标题
							array_push($pages, array($uri,$uri));
						}
					}
				}
			}
		} catch (Exception $e) {
			// 打开目录时有问题
		}
		return $pages;
	}

	// 辅助函数,按标题以字母顺序对匹配的页面排序
	function by_title($a,$b) {
		return ($a[1] == $b[1]) ? strcmp($a[0],$b[0]) : ($a[1] > $b[1]);
	
	}

	// 完成搜索的SiteSearch对象
	$search = new SiteSearch();

	// 包含于搜索项匹配的页面数组
	$matching_pages = array();
	// 文档根下要搜搜索的目录
	$search_dirs = array('sports','movies','food');
	// 搜索文件时使用正则表达式."S"模式
	// 修饰符告诉PCRE引擎“研究”这个正则表达式
	// 来提高效率
	$search->bodyRegex = '#<body>(.*'. preg_quote($_GET['term'],'#').'.*)</body>#Sis';

	// 将各个目录中匹配的文件增加到$matching页面
	foreach ($search_dirs as $dir) {
		$matching_pages = array_merge($matching_pages,$search->searchDir($_SERVER['DOCUMENT_ROOT'].'/'.$dir));
	}

	if (count($matching_pages)) {
		// 按标题对匹配页面排序
		usort($matching_pages, 'by_title');
		print '<ul>';
		// 打印各个标题,并提供相应页面的一个链接
		foreach ($matching_pages as $k => $v) {
			print sprintf('<li> <a href="%s">%s</a>',$v[0],$v[1]);
		}
		print '</ul>';
	}else{
		print 'No pages found';
	}

}